# Semigroup, Monoid и Group

Самые основные классы алгебраических типов, поддерживаемые Spire,
включают один ассоциативный бинарный оператор (называемый `op` и представленный как `|+|`): 
Операции варьируются от сложения и умножения до объединения строк или списков и не только!

## Полугруппа

`Semigroup`:

- `op` (`|+|`): ассоциативная бинарная операция

```dotty
import spire.algebra.Semigroup
import spire.syntax.semigroup.*

1 |+| 2                           // 3
("hello", 123) |+| ("world", 321) // ("helloworld",444)

Semigroup.combineN(3, 5)          // 15
```

## Моноид

`Monoid` - полугруппа, которая также имеет единичный элемент `id`. `Monoid` расширяет `Semigroup`.

- `id`: единичный элемент моноида
- `isId`: проверка на равенство единичного элемента (вместе с `Eq`)

```dotty
1 |+| Monoid.empty[Int] // 1
Monoid.isEmpty(Monoid.empty[Int])
```

## Группа

`Group` - моноид, который также имеет обратную операцию (`inverse` или `|-|`). `Group` расширяет `Monoid`.

- `inverse`: унарный оператор

```dotty
import spire.algebra.Group
import spire.syntax.group.*

1.inverse       // -1
1 |+| 1.inverse // 0
```

## Коммутативная полугруппа

`CSemigroup[A]` - полугруппа, которая является коммутативной.

```dotty
import spire.algebra.CSemigroup

CSemigroup.combine(1, 2) == CSemigroup.combine(2, 1)
```

## Коммутативный моноид

`CMonoid[A]` - моноид, который коммутативен.

```dotty
import spire.algebra.CMonoid

CMonoid.combine(100, CMonoid.empty[Int]) // 100
```

## Абелева группа

`AbGroup[A]` - "абелева группа", группа, которая является коммутативной.

```dotty
import spire.algebra.AbGroup

AbGroup[Int].inverse(1) // -1
```

## Действия

`(Left/Right/)Action[P, G]` - действия влево/вправо для полугрупп/моноидов/групп

```dotty
import spire.algebra.*
import spire.syntax.action.*
import spire.syntax.group.*

given LeftAction[Int, String] with
  def actl(g: String, p: Int): Int =
    g.toIntOption.getOrElse(0) - p

given RightAction[Int, String] with
  def actr(p: Int, g: String): Int =
    g.toIntOption.getOrElse(0) - p

"100" |+|> 10 // 90
10 <|+| "100" // 90
```

## Описание

Большинство типов имеют множество возможных реализаций этих классов типов. 
В этих случаях Spire требует от пользователей явного выбора желаемой реализации.

Spire также определяет две параллельные иерархии групп для аддитивных и мультипликативных групп. 
Они имеют одинаковые свойства, но разные имена и символы. 
В следующем списке представлены общие, аддитивные и мультипликативные варианты:

- операторный метод: `op`, `plus`, `times`
- символ оператора: `|+|`, `+`, `*`
- единичный элемент: `id`, `zero`, `one`
- обратный метод: `inverse`, `negate`, `reciprocal`
- обратный символ: `inverse`, `-`(унарный), `reciprocal`
- обратный бинарный оператор: `|-|`, `-` (двоичный), `/`

---

**Ссылки:**

- [Spire home page](https://typelevel.org/spire)
- [Spire User's Guide](https://typelevel.org/spire/guide.html)
